// 迭代方法：
let arr = [1,2,3,4];

// forEach：
//   v: 数组中的元素（必用）
//   i: 数组的索引（较少用到）
//   array：数组本身的引用（几乎不会用到）
// arr.forEach(function(v,i,array) {
//     console.log(i," = ",v);
// });

// for (let i in arr) {
//     console.log(i," = ",arr[i]);
// }

// 利用箭头函数配合迭代函数，可以大大地简化我们的代码
// 现在开发有个口号：消灭for循环
arr.forEach((v,i) => console.log(i,"=",v));

// map：创建一个新数组，由遍历每个成员的加工函数创建数组的新成员
// 创建一个新数组，由原数组中所有成员乘以2构成
// let newArr = arr.map(function(v) {
//     return v * 2;
// });
let newArr = arr.map(v => v * 2);
console.log("newArr = ",newArr);

// filter: 创建一个新数组，由通过传入函数测试通过的成员组成
// 返回一个新数组，由原数组成员 * 2之后，大于4的元素构成
newArr = arr.filter(v => v * 2 > 4);
console.log(newArr);
// 返回一个新数组，由原数组的偶数索引成员构成
newArr = arr.filter((v,i) => i % 2 == 0);
console.log(newArr);

// reduce，把上次运行的结果，累加到下次去
// 比起其它迭代函数，它多一个参数，第一个参数是当前累加值(从第二个元素开始循环，此时自动加上了第一个元素的值)
console.log("-----------reduce------------")
let result = arr.reduce((total,v) => {
    console.log("v =",v);
    return total + v;
});
console.log("result = ",result);

// reduceRight，同reduce作用一样，不过reduce是从左遍历到右，reduceRight，是从右遍历到左
console.log("-----------reduceRight------------")
result = arr.reduceRight((total,v) => {
    console.log("v =",v);
    return total + v;
});
console.log("result = ",result);

// every：测试是不是所有元素都通过了函数，返回布尔值
// some: 测试是不是有元素通过了函数，返回布尔值
// 判断所有成员是不是都大于2
let ok = arr.every(v => v > 2);
console.log("ok =",ok);
// 判断是不是有成员大于2
ok = arr.some(v => v > 2);
console.log("ok =",ok);


// indexOf：数组中元素第一次出现的索引值（这个不是高阶函数，也不是迭代函数）
// 获取2这个值，第一次出现在数组中的索引值
arr = [1,2,2,3,4,2,5];
let index = arr.indexOf(2);
console.log("index =",index); // 1

// 可以再传一个参数，从指定索引处开始查询
index = arr.indexOf(2,2);
console.log("index =",index); // 2

// 如果没有查询到，返回-1
index = arr.indexOf(9999);
console.log("index =",index); // -1

index = arr.indexOf('2'); // 查询规则严格遵守 === 的方式
console.log("index =",index); // -1

// lastIndexOf：和indexOf差不多，从数组末尾开始往前找

// find()和findIndex()：高阶函数（迭代函数），返回第一个通过函数检测的元素（索引）
// 返回第一个大于等于4的元素/索引
let fun = v => v >= 4;
let object = arr.find(fun);
index = arr.find(fun);
console.log("object =",object);
console.log("index =",index);

// map和filter是面试高发问题，forEach因为过于简单所以用得很多